package dominioProblema;

import java.util.LinkedList;

public class ControleJogada {

	protected LinkedList<Pedra> disposPedras;
	protected LinkedList<Pedra> ptaC;
	protected LinkedList<Pedra> ptaD;
	protected boolean dobleCincoJogado;
	
	public void setDobleCincoJogado(boolean dobleCincoJogado) {
		this.dobleCincoJogado = dobleCincoJogado;
	}
	
	public void atualizaDisposicao(LinkedList<Pedra> disposPedras, LinkedList<Pedra> ptaC, LinkedList<Pedra> ptaD) {
		this.disposPedras = disposPedras;
		this.ptaC = ptaC;
		this.ptaD = ptaD;
	}
	
	public boolean maoCompativel(Mao maoJog) {
		boolean compativel = false;
		int pontaA = -1;
		int pontaB = -1;
		if(this.disposPedras.isEmpty()){
			compativel = true;			
		}
		else {
			if(this.disposPedras.getFirst().isClipB()) {
				pontaA = this.disposPedras.getFirst().getLadoA();
			} else {
				if (this.disposPedras.getFirst().isClipA()){
					pontaA = this.disposPedras.getFirst().getLadoA();
				}else{
					pontaA = this.disposPedras.getFirst().getLadoB();
				}
			}
			if(this.disposPedras.getLast().isClipB()) {
				pontaB = this.disposPedras.getLast().getLadoB();
			} else {
				if (this.disposPedras.getLast().isClipA()){
					pontaB = this.disposPedras.getLast().getLadoA();
				} else {
					pontaB = this.disposPedras.getLast().getLadoB();
				}
			}
			int i = 0;
			while (i<23) {
				if(maoJog.getPedras()[i]!=null){
					if((maoJog.getPedras()[i].getLadoA()==pontaA)
							||(maoJog.getPedras()[i].getLadoB()==pontaA)){
						compativel = true;
						i = 23;
					} else{
						i++;
					}
				} else {
					i++;
				}
			}
			if (!compativel){
				if(this.disposPedras.getLast().isClipB()) {
					pontaB = this.disposPedras.getLast().getLadoB();
				} else {
					if (this.disposPedras.getLast().isClipA()){
						pontaB = this.disposPedras.getLast().getLadoA();
					} else {
						pontaB = this.disposPedras.getLast().getLadoB();
					}
				}
				int j = 0;
				while (j<23) {
					if(maoJog.getPedras()[j]!=null){
						if((maoJog.getPedras()[j].getLadoA()==pontaB)
								||(maoJog.getPedras()[j].getLadoB()==pontaB)){
							compativel = true;
							j = 23;
						} else{
							j++;
						}
					} else {
						j++;
					}
				}
			}
			if(this.dobleCincoJogado){
				int pontaC = -1;
				int pontaD = -1;
				if(!this.ptaC.isEmpty() && !compativel){
					if (this.ptaC.getLast().isClipA()){
						pontaC = this.ptaC.getLast().getLadoA();
					} else{
						pontaC = this.ptaC.getLast().getLadoB();
					}
					int k = 0;
					while(k<23){
						if(maoJog.getPedras()[k]!=null){
							if((maoJog.getPedras()[k].getLadoA()==pontaC)
									||(maoJog.getPedras()[k].getLadoB()==pontaC)){
								compativel = true;
								k = 23;
							}else{
								k++;
							}
						} else {
							k++;
						}
					}
				} 
				if(!this.ptaD.isEmpty() && !compativel){
					if (this.ptaD.getLast().isClipA()){
						pontaD = this.ptaD.getLast().getLadoA();
					}else{
						pontaD = this.ptaD.getLast().getLadoB();
					}
					int l = 0;
					while(l<23){
						if(maoJog.getPedras()[l]!=null){
							if((maoJog.getPedras()[l].getLadoA()==pontaD)
									||(maoJog.getPedras()[l].getLadoB()==pontaD)){
								compativel = true;
								l = 23;
							}else{
								l++;
							}
						} else {
							l++;
						}
					}
				}
			}
		}
		return compativel;
	}
	
	public boolean ehValida(Pedra pedra, int ponta) {	
		boolean valida = false;		
		if(this.disposPedras.isEmpty()){
			valida = true;
		} else {
			if(ponta==1){
				if(this.disposPedras.getFirst().isClipA()){
					if ((pedra.getLadoA()==this.disposPedras.getFirst().getLadoA())
							||(pedra.getLadoB()==this.disposPedras.getFirst().getLadoA())){
						valida = true;
					}							
				} else {
					if ((pedra.getLadoA()==this.disposPedras.getFirst().getLadoB())
							||(pedra.getLadoB()==this.disposPedras.getFirst().getLadoB())){
						valida = true;
					}					
				}
			}				
			if(ponta==2){
				if(this.disposPedras.getLast().isClipB()) {
					if ((pedra.getLadoA()==this.disposPedras.getLast().getLadoB())
							||(pedra.getLadoB()==this.disposPedras.getLast().getLadoB())){
						valida = true;
					}
				} else {
					if(this.disposPedras.getLast().isClipA()){
						if ((pedra.getLadoA()==this.disposPedras.getLast().getLadoA())
								||(pedra.getLadoB()==this.disposPedras.getLast().getLadoA())){
							valida = true;
						}
					}else{
						if ((pedra.getLadoA()==this.disposPedras.getLast().getLadoB())
								||(pedra.getLadoB()==this.disposPedras.getLast().getLadoB())){
							valida = true;
						}
					}
				}
			}
			if((ponta==3)&&(this.dobleCincoJogado)){
				if(this.ptaC.getLast().isClipA()){
					if ((pedra.getLadoA()==this.ptaC.getLast().getLadoA())
							||(pedra.getLadoB()==this.ptaC.getLast().getLadoA())){
						valida = true;
					}
				}else{
					if((pedra.getLadoA()==this.ptaC.getLast().getLadoB())
							||(pedra.getLadoB()==this.ptaC.getLast().getLadoB())){
						valida = true;
					}
				}
			}
			if((ponta==4)&&(this.dobleCincoJogado)){
				if(this.ptaD.getLast().isClipA()){
					if((pedra.getLadoA()==this.ptaD.getLast().getLadoA())||
							(pedra.getLadoB()==this.ptaD.getLast().getLadoA())){
						valida = true;
					}
				}else{
					if((pedra.getLadoA()==this.ptaD.getLast().getLadoB())||
							(pedra.getLadoB()==this.ptaD.getLast().getLadoB())){
						valida = true;
					}
				}
			}
		}
		return valida;
	}
	
	public boolean verificarClipA(Pedra pedra, int ponta) {		
		boolean isClipA = false;
		if(this.disposPedras.isEmpty()){
			isClipA = true;
		} else {
			if(ponta==1){
				if((pedra.getLadoA()==this.disposPedras.getFirst().getLadoA())
						||(pedra.getLadoA()==this.disposPedras.getFirst().getLadoB())){
					isClipA = false;
				} else {
					isClipA = true;
				}
			}
			if(ponta==2){
				if((pedra.getLadoA()==this.disposPedras.getLast().getLadoA())
						||(pedra.getLadoA()==this.disposPedras.getLast().getLadoB())){
					isClipA = false;
				} else {
					isClipA = true;
				}
			}
			if((ponta==3)&&(this.dobleCincoJogado)){
				if((pedra.getLadoA()==this.ptaC.getLast().getLadoA())
						||(pedra.getLadoA()==this.ptaC.getLast().getLadoB())){
					isClipA = false;
				} else {
					isClipA = true;
				}
			}
			if((ponta==4)&&(this.dobleCincoJogado)){
				if((pedra.getLadoA()==this.ptaD.getLast().getLadoA())
						||(pedra.getLadoA()==this.ptaD.getLast().getLadoB())){
					isClipA = false;
				} else {
					isClipA = true;
				}
			}
		}
		return isClipA;
	}

	public int verificarPontos() {
		int pontos = 0;
		int pontaA = 0;
		int pontaB = 0;
		int pontaC = 0;
		int pontaD = 0;
		int soma = 0;
		if(this.disposPedras.getFirst().isDouble()) {
			pontaA = this.disposPedras.getFirst().getValor();
		} else {
			if(this.disposPedras.getFirst().isClipB()) {
				pontaA = this.disposPedras.getFirst().getLadoA();
			} else {
				if (this.disposPedras.getFirst().isClipA()){
					pontaA = this.disposPedras.getFirst().getLadoA();
				}else{
					pontaA = this.disposPedras.getFirst().getLadoB();
				}
			}
		}
		if(this.disposPedras.getLast().isDouble()) {
			if(this.disposPedras.size()>1) {
				pontaB = this.disposPedras.getLast().getValor();
			}
		} else {
			if(this.disposPedras.getLast().isClipB()) {
				pontaB = this.disposPedras.getLast().getLadoB();
			} else {
				if (this.disposPedras.getLast().isClipA()){
					pontaB = this.disposPedras.getLast().getLadoA();
				} else {
					pontaB = this.disposPedras.getLast().getLadoB();
				}
			}
		}
		if((this.dobleCincoJogado) && (this.ptaC.size()>1)){
			if(this.ptaC.getLast().isDouble()) {
				pontaC = this.ptaC.getLast().getValor();
			} else {
				if (this.ptaC.getLast().isClipA()){
					pontaC = this.ptaC.getLast().getLadoA();
				} else{
					pontaC = this.ptaC.getLast().getLadoB();
				}
			}
		}
		if((this.dobleCincoJogado) && (this.ptaD.size()>1)){
			if(this.ptaD.getLast().isDouble()) {
				pontaD = this.ptaD.getLast().getValor();
			} else {
				if (this.ptaD.getLast().isClipA()){
					pontaD = this.ptaD.getLast().getLadoA();
				}else{
					pontaD = this.ptaD.getLast().getLadoB();
				}
			}
			
		}
		soma = pontaA + pontaB + pontaC + pontaD;
		if(soma%5 == 0) {
			pontos = soma;
		}
		return pontos;
	}

	public void limpaDadosRodada() {
		this.disposPedras.clear();
		this.ptaC.clear();
		this.ptaD.clear();
		this.dobleCincoJogado = false;
	}

}
